

//
//  EmoticonManager.swift
//  01-表情键盘
//
//  Created by 002 on 15/10/24.
//  Copyright © 2015年 002. All rights reserved.
//

import Foundation
import UIKit

// MARK: - 表情包管理器 - emoticon.plist
/**
1. emoticons.plist 定义表情包数组
packages 字典数组中，每一个 id 对应不同表情包的目录
2. 从 每一个表情包目录中，加载 info.plist 可以获得不同的表情内容
id	目录名
group_name_cn	表情分组名称- 显示在 toolbar 上
emoticons	 数组
字典
chs		发送给服务器的字符串
png		在本地显示的图片名称
code	emoji 的字符串编码

*/
class EmoticonManager {

    // 单例
    static let sharedManager = EmoticonManager()
    
    // 表情包数组
    var packages = [EmoticonPackage]()
    
    private init() {
        
        // 追加一个‘默认’分组
        packages.append(EmoticonPackage.init(dict: ["group_name_cn" : "最近A"]))
        
        // 1. 获取字典路径
        let path = NSBundle.mainBundle().pathForResource("emoticons.plist", ofType: nil, inDirectory: "Emoticons.bundle")!
        
        // 2. 从路径加载字典
        let dict = NSDictionary.init(contentsOfFile: path) as! [String : AnyObject]
        
        // 3. 读取字典中的id数组
        let array = (dict["packages"] as! NSArray).valueForKey("id")
        
        // 4. 遍历id数组添加到表情包中
        for id in array as! [String] {
            loadInfoPlist(id)
        }
        
        print(packages)
    }
    
    // MARK: - 加载每一个 id 目录下的 info.plist
    private func loadInfoPlist(id : String) {
        
        // 1. 获取info.plist路径
        let path = NSBundle.mainBundle().pathForResource("info.plist", ofType: nil, inDirectory: "Emoticons.bundle/\(id)")!
        
        // 2. 从路径转字典 - 一个独立的表情包
        let dict = NSDictionary.init(contentsOfFile: path) as! [String : AnyObject]
        
        // 3. 字典转模型
        let package = EmoticonPackage.init(dict: dict)
        
        // 4. 追加到表情包数组中
        packages.append(package)
    }
    
    /// 使用字符串查找表情符号
    ///
    /// - parameter string: [爱你]
    ///
    /// - returns: 表情模型
    private func emoticon(string: String) -> Emoticon? {
        
        // 1. 遍历表情包的数组
        for p in EmoticonManager.sharedManager.packages {
            
            // 2. 在 emoticons 数组中查找 chs == string 的表情符号
            if let em = p.emoticons.filter({ (em) -> Bool in
                return em.chs == string
            }).last {
                return em
            }
        }
        return nil
    }
    
    /// 使用正则表达式将字符串替换成带表情图片的属性字符串
    ///
    /// - parameter string: 字符串
    ///
    /// - returns: 带表情的属性字符串
    func emoticonText(string: String, font: UIFont) -> NSAttributedString {
        
        let strM = NSMutableAttributedString(string: string)
        
        // 1. 正则表达式
        let pattern = "\\[.*?\\]"
        let regex = try! NSRegularExpression(pattern: pattern, options: [])
        
        let results = regex.matchesInString(string,
            options: [],
            range: NSRange(location: 0, length: string.characters.count))
        
        var count = results.count
        
        // 倒着遍历
        while count > 0 {
            let result = results[--count]
            
            let range = result.rangeAtIndex(0)
            let emStr = (string as NSString).substringWithRange(range)
            
            if let em = emoticon(emStr) {
                let imageText = EmoticonAttachment(emoticon: em).imageText(font)
                strM.replaceCharactersInRange(range, withAttributedString: imageText)
            }
        }
        
        return strM.copy() as! NSAttributedString
    }
}
